/**
 * @file    window.h
 * @brief   Funçoes para criaçao e manipulacao de janelas.
 *      
 */

#ifdef	__cplusplus
extern "C" {
#endif

    /* Scale vertically depending on video standard */
    //#define yScale(x) (((x) * gblGetYFactor()) / 10)
    /* Dimensoes da janela */
#define D1_WIDTH                 720
#define D1_HEIGHT                480
#define D1_LINE_WIDTH            D1_WIDTH * SCREEN_BPP / 8
#define D1_FRAME_SIZE            D1_LINE_WIDTH * D1_HEIGHT

#define WINDOW_SUCCESS      0
#define WINDOW_FAILURE      -1
#define WINDOW_MAX_NUMBER  30          // Numero maximo de janelas
#define ELEMENT_PRESSED_BUTTON  0x0000
#define ELEMENT_PRESSED_EDITBOX 0x0100
#define ELEMENT_PRESSED_ICON    0x0200

    /**
     * @brief Cria uma janela
     * @param int x      Coordenada x da posiçao da janela
     * @param int y      Coordenada y da posiçao da janela
     * @param int width  Largura da janela em pixels
     * @param int height Altura da janela em pixels
     * @return int Retorna o id da janela ou WINDOW_FAILURE.
     */
    extern signed int window_create(unsigned int x, unsigned int y, unsigned int width, unsigned int height);

    /* Destroi a janela, desassocia todos os seus componentes, e libera id da
     * janela para uso por novas janelas criadas. */
    extern signed int window_destroy();

    extern signed int window_changeActual(signed int windowId);

    extern void window_refresh();

    /**
     * @brief Faz a transiçao para windowId
     * @param int windowId Id da proxima atual
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    //extern int window_changeActual(int windowId);

    /**
     * @brief Define uma imagem de fundo para a janela
     * @param int windowId   Id da janela
     * @param char *filename Nome do arquivo que contem a imagem 
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_setBackground(signed int windowId, unsigned char *filename);

    extern signed int window_setBackgroundColor(signed int windowId, unsigned char r, unsigned char g, unsigned char b);

    /**
     * @brief Define a visibilidade da imagem de fundo da janela
     * @param int windowId   Id da janela
     * @param unsigned char visibility  0 para não visível, 1 para visível
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_setBackgroundVisibility(signed int windowId, unsigned char visibility);

    /**
     * @brief Exibe a imagem de fundo da janela
     * @param int windowId   Id da janela
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_showBackground(signed int windowId);

    /**
     * @brief Retorna a altura da janela em pixels.
     * @param inr windowId          Id da janela.
     * @return int                  Retorna a altura da janela ou WINDOW_FAILURE em caso de falha.
     */
    extern signed int window_getHeight(signed int windowId);

    /**
     * @brief Retorna a largura da janela em pixels.
     * @param int windowId          Id da janela.
     * @return int                  Retorna a largura da janela ou WINDOW_FAILURE em caso de falha.
     */
    extern signed int window_getWidth(signed int windowId);

    extern signed int window_setEnable(signed int windowId);

    extern signed int window_setVisibility(signed int windowId, unsigned char visibility);

    extern signed int window_getEnable();

    /**
     * @brief Insere botao na janela
     * @param int windowId Id da janela
     * @param int buttonId Id do botao a ser adicionado
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertButton(signed int windowId, signed int buttonId);

    /**
     * @brief Retorna o id do ultimo botao a ser adicionado a janela.
     * @param int windowId Id da janela
     * @return int Retorna o id do botao atual ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualButton(signed int windowId);

    /**
     * @brief Retorna o botao selecionado na janela
     * @param int windowId Id da janela
     * @return int Retorna o id do botao selecionado ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualButton_selected(signed int windowId);

    /**
     * @brief Seleciona o botao anterior na janela
     * @param int windowId Id da janela a qual o botao pertence
     * @return int Retorna o id do botao selecionado ou WINDOW_FAILURE
     */
    extern signed int window_previousButton(signed int windowId);

    /**
     * @brief Seleciona o proximo botao na janela
     * @param int windowId Id da janela a qual o botao pertence
     * @return int Retorna o id do botao selecionado ou WINDOW_FAILURE
     */
    extern signed int window_nextButton(signed int windowId);

    /**
     * @brief Insere icone na janela
     * @param int windowId Id da janela
     * @param int iconId Id do icone a ser adicionado
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertIcon(signed int windowId, signed int iconId);

    /**
     * @brief Retorna o id do ultimo icone a ser adicionado a janela.
     * @param int windowId Id da janela
     * @return int Retorna o id do icone atual ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualIcon(signed int windowId);

    /**
     * @brief Retorna o icone selecionado na janela
     * @param int windowId Id da janela
     * @return int Retorna o id do icone selecionado ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualIcon_selected(signed int windowId);

    /**
     * @brief Seleciona o icone anterior na janela
     * @param int windowId Id da janela a qual o icone pertence
     * @return int Retorna o id do icone selecionado ou WINDOW_FAILURE
     */
    extern signed int window_previousIcon(signed int windowId);

    /**
     * @brief Seleciona o proximo icone na janela
     * @param int windowId Id da janela a qual o icone pertence
     * @return int Retorna o id do icone selecionado ou WINDOW_FAILURE
     */
    extern signed int window_nextIcon(signed int windowId);

    /**
     * @brief Insere editbox na janela
     * @param int windowId  Id da janela
     * @param int editboxId Id do editbox a ser adicionado
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertEditbox(signed int windowId, signed int editboxId);

    /**
     * @brief Retorna o id do ultimo editbox a ser adicionado a janela.
     * @param int windowId Id da janela
     * @return int Retorna o id do editbox atual ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualEditbox(signed int windowId);

    /**
     * @brief Retorna o editbox selecionado na janela
     * @param int windowId Id da janela
     * @return int Retorna o id do editbox selecionado ou WINDOW_FAILURE
     */
    extern signed int window_inform_actualEditbox_selected(signed int windowId);

    /**
     * @brief Seleciona o editbox anterior na janela
     * @param int windowId Id da janela a qual o editbox pertence
     * @return int Retorna o id do editbox selecionado ou WINDOW_FAILURE
     */
    extern signed int window_previousEditbox(signed int windowId);

    /**
     * @brief Seleciona o proximo editbox na janela
     * @param int windowId Id da janela a qual o editbox pertence
     * @return int Retorna o id do editbox selecionado ou WINDOW_FAILURE
     */
    extern signed int window_nextEditbox(signed int windowId);

    /**
     * @brief Insere imagem na janela
     * @param int windowId  Id da janela
     * @param int imageId   Id da imagem a ser adicionada
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertImage(signed int windowId, signed int imageId);

    /**
     * @brief Insere label na janela
     * @param int windowId  Id da janela
     * @param int labelId   Id da imagem a ser adicionada
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertLabel(signed int windowId, signed int labelId);

    /**
     * @brief Insere listbox na janela
     * @param int windowId  Id da janela
     * @param int listboxId Id do listbox
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertListbox(signed int windowId, signed int listboxId);

    /**
     * @brief Insere listener na janela
     * @param int windowId  Id da janela
     * @param int listenerId Id do listbox
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertListener(signed int windowId, signed int listenerId);

    /**
     * @brief Retorna o id do ultimo listbox a ser adicionado a janela.
     * @param int windowId              Id da janela.
     * @return int                      Retorna o id do listbox atual ou WINDOW_FAILURE.
     */
    extern signed int window_inform_actualListbox(signed int windowId);

    /**
     * @brief Insere multieditbox na janela
     * @param int windowId  Id da janela
     * @param int listboxId Id do multieditbox
     * @return int Retorna WINDOW_SUCCESS ou WINDOW_FAILURE
     */
    extern signed int window_insertMultieditbox(signed int windowId, signed int multieditId);

    /**
     * @brief Retorna o id do ultimo multieditbox a ser adicionado a janela.
     * @param int windowId              Id da janela.
     * @return int                      Retorna o id do multieditbox atual ou WINDOW_FAILURE.
     */
    extern signed int window_inform_actualMultieditbox(signed int windowId);

    extern signed int window_removeButton(signed int windowId, signed int buttonId);

    extern signed int window_removeEditbox(signed int windowId, signed int editboxId);

    extern signed int window_removeIcon(signed int windowId, signed int iconId);

    extern signed int window_removeImage(signed int windowId, signed int imageId);

    extern signed int window_removeLabel(signed int windowId, signed int labelId);

    extern signed int window_removeListbox(signed int windowId, signed int listboxId);

    extern signed int window_removeListener(signed int windowId, signed int listenerId);

    extern signed int window_removeMultieditbox(signed int windowId, signed int multieditboxId);

    extern void window_setComponentsRedraw(signed int windowId);

#ifdef	__cplusplus
}
#endif
